package com.zhf.rabbitmq.helloworld;

import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * @author: 曾鸿发
 * @create: 2022-01-08 17:33
 * @description：
 **/
public class Consumer {

    public static void main(String[] args) throws Exception{
        // 设置rabbitmq相关信息
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.199.128");
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/baiqi_1127");
        connectionFactory.setUsername("zhf");
        connectionFactory.setPassword("123456");
        // 通过工厂获得与MQ的连接，获取TCP长连接
        Connection connection = connectionFactory.newConnection();
        // 创建通信 “通道”，相当于TCP中的虚拟连接
        Channel channel = connection.createChannel();
        /*
        参数1:队列的名称
        参数2:队列中的数据是否持久化
        参数3:是否排外（是否支持扩展，当前队列只能自己用，不能给别人用）
        参数4:是否自动删除（当队列的连接数为0时，队列会销毁，不管队列是否还存保存数据）
        参数5:队列参数（没有参数为null）
         */
        channel.queueDeclare("helloworld", false, false, false, null);

        // 从MQ服务器中拉取数据
        // 创建一个消息消费者
        // 第一个参数：队列名
        // 第二个参数代表是否自动确认收到信息，false代表手动编程来确认信息，这是MQ的推荐做法
        // 第三个参数要传入DefaultConsumer的实现类
        channel.basicConsume("helloworld", false, new Receiver(channel));
    }
}

class Receiver extends DefaultConsumer{

    private Channel channel;

    public Receiver(Channel channel) {
        super(channel);
        this.channel = channel;
    }

    @Override
    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
        String message = new String(body);
        System.out.println("消费者接收到的消息： " + message);
        System.out.println("消息的TagId： " + envelope.getDeliveryTag());
        // false 代表只确认当前消息，设置为true的时候则代表签收该消费者所有未签收的消息
        channel.basicAck(envelope.getDeliveryTag(), false);
    }
}